//=============================================================================
// IMPLEMENTACIO DE LA CLASSE 'UTILS'
//=============================================================================
// per Marc Delgado (marcdelgado@gmail.com) | rev. 2012.06.11

#include "utils.hpp"


// FUNCIONS PUBLIQUES
///////////////////////////////////////////////////////////////////////////////


void utils::mapArray (char* pArr, int pLen, int pBase)
{
	if(pBase == BIN) mapArray_bin(pArr, pLen);
	else if (pBase == HEX) mapArray_hex(pArr, pLen);
	else if (pBase == ASCII) mapArray_ascii(pArr, pLen);
}


// FUNCIONS PRIVADES
///////////////////////////////////////////////////////////////////////////////


void utils::mapArray_bin(char* pArr, int pLen)
{
	cout << "=========================================================================";
	cout << endl << "Byte    +0 a +3                          +4 a +7               (MSB sort)" << endl;
	cout << "-------------------------------------------------------------------------";
	for (int i = 0; i < pLen; i++)
	{
		if (i%4==0) cout << " ";
		if (i%8==0) cout << endl << "<" << i << ">" "\t";
		byte val = pArr[i];
		cout << val.getBit(7) << val.getBit(6) << val.getBit(5) << val.getBit(4);
		cout << val.getBit(3) << val.getBit(2) << val.getBit(1) << val.getBit(0);
	}
	cout << endl;
	cout << "=========================================================================";
	cout << endl;
}


void utils::mapArray_hex(char* pArr, int pLen)
{
	cout << "=========================================================================";
	cout << endl << "Byte    +0 a +15                         +16 a +31" << endl;
	cout << "-------------------------------------------------------------------------";
	pair<char,char> res;
	for (int i = 0; i < pLen; i++)
	{
		if (i%16==0) cout << " ";
		if (i%32==0) cout << endl << "<" << i << ">" "\t";
		char val = pArr[i];
		byte car(val);
		res = car.toHex();
        cout << res.first << res.second;
	}
	cout << endl;
	cout << "=========================================================================";
	cout << endl;
}


void utils::mapArray_ascii(char* pArr, int pLen)
{
	cout << "=========================================================================";
	cout << endl << "Byte    +0 a +31                         +32 a +63" << endl;
	cout << "-------------------------------------------------------------------------";
	for (int i = 0; i < pLen; i++)
	{
		if (i%32==0) cout << " ";
		if (i%64==0) cout << endl << "<" << i << ">" "\t";
		char val = pArr[i];
		if ((31 < val) && (val < 127)) cout << val;  //para caracteres no imprimibles
		else cout << " ";
	}
	cout << endl;
	cout << "=========================================================================";
	cout << endl;
}
